home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / PCCP024.ARJ / PORT.C < prev    next >
C/C++ Source or Header  |  1992-05-17  |  4KB  |  213 lines

  1. /* Copyright (C) 1992 Peter Edward Cann, all rights reserved */
  2.  
  3. #include<stdio.h>
  4. #include<bios.h>
  5. #include<dos.h>
  6. #include"port.h"
  7.  
  8. int index, basereg;
  9. unsigned char diffintmask, irqnum;
  10. void (interrupt far *oldvect)();
  11.  
  12. unsigned char buf[TBUFSIZ];
  13.  
  14. void interrupt far inthndl(_es, _ds, _di, _si, _bp, _sp,
  15.               _bx, _dx, _cx, _ax, _ip, _cs, _flags)
  16.     unsigned _es, _ds, _di, _si, _bp, _sp;
  17.     unsigned _bx, _dx, _cx, _ax, _ip, _cs, _flags;
  18.     {
  19.     if(inp(basereg+STATREG)&0x01)
  20.         {
  21.         buf[index++]=inp(basereg)&0xff;
  22.         index=index%TBUFSIZ;
  23.         }
  24.     outp(INTBASE1, INTACK);
  25.     outp(INTBASE2, INTACK);
  26.     }
  27.  
  28. unsigned char lctl;
  29. unsigned int speed, comnum;
  30. char databits, parity, stopbits;
  31.  
  32. unsigned char newintmask, oldintmask, lctl, dlmsb, dllsb;
  33. unsigned intnum;
  34. unsigned char oldlctl, olddllsb, olddlmsb, oldintctl, oldmctl;
  35.  
  36. setport()
  37.     {
  38.     newintmask=0;
  39.     switch(comnum)
  40.         {
  41.         case 0:
  42.             irqnum=4;
  43.             diffintmask=0xff&~0x10;
  44.             basereg=0x3f8;
  45.             break;
  46.         case 1:
  47.             irqnum=3;
  48.             diffintmask=0xff&~0x08;
  49.             basereg=0x2f8;
  50.             break;
  51.         case 2:
  52.             irqnum=4;
  53.             diffintmask=0xff&~0x10;
  54.             basereg=0x3e8;
  55.             break;
  56.         case 3:
  57.             irqnum=3;
  58.             diffintmask=0xff&~0x08;
  59.             basereg=0x2e8;
  60.             break;
  61.         case 4:
  62.             irqnum=2;
  63.             diffintmask=0xff&~0x02;
  64.             basereg=0x3e8;
  65.             break;
  66.         case 5:
  67.             irqnum=2;
  68.             diffintmask=0xff&~0x02;
  69.             basereg=0x2e8;
  70.             break;
  71.         case 6:
  72.             irqnum=5;
  73.             diffintmask=0xff&~0x20;
  74.             basereg=0x3e8;
  75.             break;
  76.         case 7:
  77.             irqnum=5;
  78.             diffintmask=0xff&~0x20;
  79.             basereg=0x2e8;
  80.             break;
  81.         default:
  82.             printf("Bad port choice.\n");
  83.             exit(4);
  84.         }
  85.     intnum=irqnum+8;
  86.     switch(speed)
  87.         {
  88.         case 300:
  89.             dlmsb=0;
  90.             dllsb=0xc0;
  91.             break;
  92.         case 1200:
  93.             dlmsb=0;
  94.             dllsb=0x60;
  95.             break;
  96.         case 2400:
  97.             dlmsb=0;
  98.             dllsb=0x30;
  99.             break;
  100.         case 9600:
  101.             dlmsb=0;
  102.             dllsb=0x0c;
  103.             break;
  104.         case 19200:
  105.             dlmsb=0;
  106.             dllsb=0x06;
  107.             break;
  108.         case 38400:
  109.             dlmsb=0;
  110.             dllsb=0x03;
  111.             break;
  112.         case 57600:
  113.             dlmsb=0;
  114.             dllsb=0x02;
  115.             break;
  116.         default:
  117.             printf("Bad speed %d.\n", speed);
  118.             exit(5);
  119.         }
  120.     lctl=0;
  121.     switch(parity)
  122.         {
  123.         case 'e':
  124.         case 'E':
  125.             lctl |= PARITYEN | PARITYEVEN;
  126.             break;
  127.         case 'o':
  128.         case 'O':
  129.             lctl|=PARITYEN;
  130.             break;
  131.         case 'n':
  132.         case 'N':
  133.             break;
  134.         default:
  135.             printf("Bad parity.\n");
  136.             exit(7);
  137.         }
  138.     switch(databits)
  139.         {
  140.         case '7':
  141.             lctl|=DB7;
  142.             break;
  143.         case '8':
  144.             lctl|=DB8;
  145.             break;
  146.         default:
  147.             printf("Bad data bits.\n");
  148.             exit(8);
  149.         }
  150.     switch(stopbits)
  151.         {
  152.         case '1':
  153.             break;
  154.         case '2':
  155.             lctl|=STOP2;
  156.             break;
  157.         default:
  158.             printf("Bad stop bits.\n");
  159.             exit(9);
  160.         }
  161.     }
  162.  
  163. readset()
  164.     {
  165.     oldlctl=inp(basereg+LCTLREG);
  166.     outp(basereg+LCTLREG, DLAB);
  167.     olddllsb=inp(basereg+DLLSBREG);
  168.     olddlmsb=inp(basereg+DLMSBREG);
  169.     outp(basereg+LCTLREG, oldlctl);
  170.     oldvect=_dos_getvect(intnum);
  171.     oldmctl=inp(basereg+MCTLREG);
  172.     oldintmask=(intnum==10)?inp(INTMASK2):inp(INTMASK1);
  173.     }
  174.     
  175. setup()
  176.     {
  177.     outp(basereg+LCTLREG, DLAB);
  178.     outp(basereg+DLLSBREG, dllsb);
  179.     outp(basereg+DLMSBREG, dlmsb);
  180.     outp(basereg+LCTLREG, lctl);
  181.     _dos_setvect(intnum, inthndl);
  182.     oldintctl=inp(basereg+INTCTLREG);
  183.     outp(basereg+INTCTLREG, 0x00);
  184.     outp(basereg+MCTLREG, 0x0b);
  185.     newintmask=diffintmask;
  186.     newintmask&=oldintmask;
  187.     if(intnum==10)
  188.         outp(INTMASK2, newintmask);
  189.     else
  190.         outp(INTMASK1, newintmask);
  191.     outp(INTBASE1, INTACK); /* Clean up leftovers */
  192.     outp(INTBASE2, INTACK);
  193.     outp(basereg+INTCTLREG, 0x01);
  194.     outp(INTBASE1, INTACK); /* What a zoo! */
  195.     outp(INTBASE2, INTACK);
  196.     }
  197.  
  198. cleanup()
  199.     {
  200.     if(intnum==10)
  201.         outp(INTMASK2, oldintmask);
  202.     else
  203.         outp(INTMASK1, oldintmask);
  204.     outp(basereg+LCTLREG, DLAB);
  205.     outp(basereg+DLLSBREG, olddllsb);
  206.     outp(basereg+DLMSBREG, olddlmsb);
  207.     outp(basereg+LCTLREG, oldlctl);
  208.     outp(basereg+INTCTLREG, oldintctl);
  209.     outp(basereg+MCTLREG, oldmctl);
  210.     _dos_setvect(intnum, oldvect);
  211.     }
  212.  
  213.